package test;

import java.util.Random;

import org.junit.Test;

public class test {
	
	// or
	@Test
	public void or(){
		int[] typeNum = {5,25,100,500,2500};
		int[] num = {10000,100000,1000000};
		int testTableNum = 10; // 批量测试表的数量
		//test
//		int[] typeNum = {500};
//		int[] num = {10000};
		
		for(int total:num){
			// 初始化数据库
			for(int type:typeNum){
				for(int i=0;i<testTableNum;i++){
					// 删除表
					UserDao.dropTable("demo"+i);
					// 创建表
					UserDao.addtable("demo"+i);
					// 添加数据
					UserDao.addUser(total,type,"demo"+i);
				}
				long sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间
					sum +=UserDao.deleteByOr(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum );
				}
				System.err.println("---"+total+"条数据----or--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
			}
		}
	}
	
	// 无索引
	@Test
	public void typeNoIndex(){
		int[] typeNum = {5,25,100,500,2500};
		int[] num = {10000,100000,1000000};
		int testTableNum = 10; // 批量测试表的数量
		//test
//		int[] typeNum = {500};
//		int[] num = {10000};
		for(int total:num){
			for(int type:typeNum){
				for(int i=0;i<testTableNum;i++){
					// 删除表
					UserDao.dropTable("demo"+i);
					// 创建表
					UserDao.addtable("demo"+i);
					// 添加数据
					UserDao.addUser(total,type,"demo"+i);
				}
				long sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间
					sum +=UserDao.deleteByNoIndex(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum);
				}
				System.err.println("---"+total+"条数据----no index--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
			}
		}
	}
	
	// 有索引 
	@Test	
	public void typeIndex(){
		int[] typeNum = {5,25,100,500,2500};
		int[] num = {10000000};
		int testTableNum = 1; // 批量测试表的数量
		//test
//		int[] typeNum = {500};
//		int[] num = {10000};
		for(int total:num){
			for(int type:typeNum){
				for(int i=0;i<testTableNum;i++){
					// 删除表
					UserDao.dropTable("demo"+i);
					// 创建表
					UserDao.addtableIndex("demo"+i);
					// 添加数据
					UserDao.addUser(total,type,"demo"+i);
				}
				long sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间
					sum +=UserDao.deleteByIndex(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum);
				}
				System.err.println("---"+total+"条数据----index--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
			}
		}
	}
	
	// in
	@Test
	public void In(){
		int[] typeNum = {5,25,100,500,2500};
		int[] num = {10000,100000,1000000};
		int testTableNum = 10; // 批量测试表的数量
		//test
//		int[] typeNum = {500};
//		int[] num = {10000};
		for(int total:num){
			for(int type:typeNum){
				for(int i=0;i<testTableNum;i++){
					// 删除表
					UserDao.dropTable("demo"+i);
					// 创建表
					UserDao.addtable("demo"+i);
					// 添加数据
					UserDao.addUser(total,type,"demo"+i);
				}
				long sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间
					sum +=UserDao.deleteByIn(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum);
				}
				System.err.println("---"+total+"条数据----in--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
			}
		}
	}
	
	// every delete  
	@Test
	public void del(){
		int[] typeNum = {5,25,100,500,2500};
		int[] num = {10000,100000,1000000};
		int testTableNum = 10; // 批量测试表的数量
		//test
//		int[] typeNum = {500};
//		int[] num = {10000};
		for(int total:num){
			for(int type:typeNum){
				for(int i=0;i<testTableNum;i++){
					// 删除表
					UserDao.dropTable("demo"+i);
					// 创建表
					UserDao.addtable("demo"+i);
					// 添加数据
					UserDao.addUser(total,type,"demo"+i);
				}
				long sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间  同时批量提交 type*testTableNum  数量
					sum +=UserDao.deleteByEveryWhere(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum);
				}
				System.err.println("---"+total+"条数据----every del--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
			}
		}
	}
	
	// init db
	@Test
	public void init(){
		int type = 2500;
		int total = 1000000;
		int testTableNum = 1; // 批量测试表的数量 
		System.err.println("------初始化数据---type:"+type+"--total:"+total+"--");
		for(int i=0;i<testTableNum;i++){
			// 删除表
			UserDao.dropTable("demo"+i);
			// 创建表  type 无索引表
//			UserDao.addtable("demo"+i);
			
			// 创建表 type 索引表
			UserDao.addtableIndex("demo"+i);
			
			// 添加数据
			UserDao.addUser(total,type,"demo"+i);
		}
		System.err.println("------初始化数据结束-------");
	}
 	
	@Test
	public void all(){
//		or();
//		typeNoIndex();
//		typeIndex();
//		In();
//		del();
	}
	
	// 测试删除数据      不包含有索引情况
	@Test
	public void allTest(){
		int[] typeNum = {5,25,100,500,2500};
		int[] num = {10000000};
		int testTableNum = 1; // 批量测试表的数量 
		//test
//		int[] typeNum = {5};
//		int[] num = {10000};
		for(int total:num){
			for(int type:typeNum){
				System.err.println("------初始化数据---type:"+type+"--total:"+total+"--");
				for(int i=0;i<testTableNum;i++){
					// 删除表
					UserDao.dropTable("demo"+i);
					// 创建表
					UserDao.addtable("demo"+i);
					// 添加数据
					UserDao.addUser(total,type,"demo"+i);
				}
				System.err.println("------初始化数据结束-------");
				// 1or
				long sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间
					sum +=UserDao.deleteByOr(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum );
				}
				System.err.println("---"+total+"条数据----or--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
				// 2no index
				sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间
					sum +=UserDao.deleteByNoIndex(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum);
				}
				System.err.println("---"+total+"条数据----no index--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
				// 3in
				sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间
					sum +=UserDao.deleteByIn(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum);
				}
				System.err.println("---"+total+"条数据----in--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
				// 4every del
				sum = 0;
				for(int i=0;i<10;i++){
					// 获取删除数据时间  同时批量提交 type*testTableNum  数量
					sum +=UserDao.deleteByEveryWhere(3,total,type,"demo",testTableNum);
					// 添加被刪除的数据
					UserDao.addUserByDelete(3,total,type,"demo",testTableNum);
				}
				System.err.println("---"+total+"条数据----every del--------删除"+type+"条平均时间是------------------:"+sum/10+" ms");
			}
		}
	}
	
	// 批量插入/更新数据 测试
	@Test
	public void addData(){
		// 先初始化数据 1W 10W 100W 1000W
		int[] num = {10000,100000,1000000,10000000};
		int[] addNumType = {5,25,100,500,2500};
		int testTableNum = 1; // 批量测试表的数量 
		Random r = new Random();
		for(int total:num){
			System.err.println("------初始化数据-----total:"+total+"--");
			for(int i=0;i<testTableNum;i++){
				// 删除表
				UserDao.dropTable("demo"+i);
				// 创建表  type 无索引表
				UserDao.addtable("demo"+i);
				// 添加数据
				UserDao.addUser(total,1,"demo"+i);
				// 删除表
				UserDao.dropTable("demoIndex"+i);
				// 创建表 type 索引表
				UserDao.addtableIndex("demoIndex"+i);
				// 添加数据
				UserDao.addUser(total,1,"demoIndex"+i);
			}
			System.err.println("------初始化数据结束-------");
			
			for(int addNum:addNumType){
				long sum = 0;
				long sumIndex = 0;
//				for(int i=0;i<10;i++){ 
//					// 插入数据
//					sum +=UserDao.insertData(addNum,total,"demo",testTableNum);
//					// 删除数据
//					UserDao.deleteByinsert(addNum,total,"demo",testTableNum);
//				}
			//	System.err.println("---"+total+"条数据----无索引表-------插入"+addNum+"条数据，的评价时间是------:"+sum/10+" ms");
			//	System.err.println("---"+total+"条数据----索引表-------插入"+addNum+"条数据，的评价时间是------:"+sum/10+" ms");
			//	sum = 0;
				for(int i=0;i<10;i++){
					// 先随机获取一组需要更新的id
					int[] dataId = new int[addNum];
					int y = 0;
					for(int j=0;j<addNum;j++){
						y = r.nextInt(total);
						dataId[j] = y;
					}
					// 更新数据
					sum +=UserDao.updateData(addNum,total,"demo",testTableNum,dataId);
					// 更新数据
					sumIndex +=UserDao.updateData(addNum,total,"demoIndex",testTableNum,dataId);
				}
				System.err.println("---"+total+"条数据----无索引表-------更新"+addNum+"条数据，的评价时间是------:"+sum/10+" ms");
				System.err.println("---"+total+"条数据----索引表---------更新"+addNum+"条数据，的评价时间是------:"+sumIndex/10+" ms");
			}
		}
	}
	
	@Test
	public void selectData(){
		// 先初始化数据 1W 10W 100W 1000W
		int[] num = {10000,100000,1000000,10000000};
		int[] selectNumType = {5,25,100,500,2500};
		int testTableNum = 1; // 批量测试表的数量 
		Random r = new Random();
		for(int total:num){
			System.err.println("------初始化数据-----total:"+total+"--");
			for(int i=0;i<testTableNum;i++){
				// 删除表
				UserDao.dropTable("demo"+i);
				// 创建表  type 无索引表
				UserDao.addtable("demo"+i);
				// 添加数据
				UserDao.addUser(total,1,"demo"+i);
				// 删除表
				UserDao.dropTable("demoIndex"+i);
				// 创建表 type 索引表
				UserDao.addtableIndex("demoIndex"+i);
				// 添加数据
				UserDao.addUser(total,1,"demoIndex"+i);
			}
			System.err.println("------初始化数据结束-------");
			for(int selectNum:selectNumType){
				long sum = 0;
				long sumIndex =0;
				for(int i=0;i<10;i++){
					int[] dataId = new int[selectNum];
					int y = 0;
					for(int j=0;j<selectNum;j++){
						y = r.nextInt(total);
						dataId[j] = y;
					}
					//查询数据
					//无索引表
					sum += UserDao.selectData(selectNum,total,"demo",testTableNum,dataId);
					
					//查询数据
					//索引表
					sumIndex += UserDao.selectData(selectNum,total,"demoIndex",testTableNum,dataId);
				}
				System.err.println("---"+total+"条数据----无索引表-------查询"+selectNum+"条数据，的评价时间是------:"+sum/10+" ms");
				System.err.println("---"+total+"条数据----索引表---------查询"+selectNum+"条数据，的评价时间是------:"+sumIndex/10+" ms");
			}
		}
	}
}
